package com.wuyou.util;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 导出工具
 * @author xt
 * @date 2023/5/4 11:42
 */
public class ExportUtil {

    /**
     * 导出
     * @param response 响应
     * @param fileName 文件名
     * @param list 数据
     * @param tClass 数据class
     * @param <T> 数据泛型
     */
    public static <T> void  export(HttpServletResponse response,String fileName, List<T> list, Class<T> tClass) throws IOException {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename="
                + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");
        // 编码
        response.setCharacterEncoding("UTF-8");
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), tClass, list);
        workbook.write(response.getOutputStream());
    }

    /**
     * 下载excel文件
     * @param response 响应
     * @param fileName 文件名
     * @param workbook 工作区
     */
    public static <T> void  downloadExcel(HttpServletResponse response,String fileName, Workbook workbook) throws IOException {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename="
                + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");
        // 编码
        response.setCharacterEncoding("UTF-8");
        workbook.write(response.getOutputStream());
    }

    public static void main(String[] args) throws IOException {
        List<JSONObject> maps = JSON.parseArray("[{\"编码\":\"GENERAL_NO_ERROR\",\"业务模块\":\"任务中心\",\"名称\":\"生成单号错误\",\"国际化键\":\"message.task.generate_order_number_error\",\"消息\":\"生成单号错误\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_TYPE_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"任务类型不存在\",\"国际化键\":\"message.task.task_type_not_exist\",\"消息\":\"任务类型不存在\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"DATA_TYPE_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"任务来源不存在\",\"国际化键\":\"message.task.data_type_not_exist\",\"消息\":\"任务来源不存在\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_STATUS_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"任务状态不存在\",\"国际化键\":\"message.task.task_status_not_exist\",\"消息\":\"任务状态不存在\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"STATUS_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"任务有效状态不存在\",\"国际化键\":\"message.task.status_not_exist\",\"消息\":\"任务有效状态不存在\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"DUTY_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"未找到责任人\",\"国际化键\":\"message.task.duty_not_exist\",\"消息\":\"未找到责任人\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"DUTY_ROLES_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"责任人角色(dutyRoles)为空\",\"国际化键\":\"message.task.duty_roles_not_exist\",\"消息\":\"责任人角色(dutyRoles)为空\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"任务未找到\",\"国际化键\":\"message.task.task_not_exist\",\"消息\":\"任务未找到\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"STATUS_FLOW_NOT_EXIST\",\"业务模块\":\"任务中心\",\"名称\":\"状态流配置未找到\",\"国际化键\":\"message.task.status_flow_not_exist\",\"消息\":\"状态流配置未找到\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_TYPE_EXISTS\",\"业务模块\":\"任务中心\",\"名称\":\"任务类型{}已经存在\",\"国际化键\":\"message.task.task_type_exists\",\"消息\":\"任务类型{}已经存在\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"NODE_LIST_CONFIGURATION_IS_EMPTY\",\"业务模块\":\"任务中心\",\"名称\":\"节点列表配置为空\",\"国际化键\":\"message.task.node_list_configuration_is_empty\",\"消息\":\"节点列表配置为空\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"CURRENT_STATE_FLOW_HAS_BEEN_REACHED\",\"业务模块\":\"任务中心\",\"名称\":\"当前已经最终的状态流了，无法往后走了\",\"国际化键\":\"message.task.current_state_flow_has_been_reached\",\"消息\":\"当前已经最终的状态流了，无法往后走了\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"NOT_MATCHED_TO_FLOW_NODE\",\"业务模块\":\"任务中心\",\"名称\":\"未匹配到当前业务流节点\",\"国际化键\":\"message.task.not_matched_to_flow_node\",\"消息\":\"未匹配到当前业务流节点\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"REQUEST_ERROR\",\"业务模块\":\"任务中心\",\"名称\":\"请求外部接口出错\",\"国际化键\":\"message.task.error_requesting_external_interface\",\"消息\":\"请求外部接口出错\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"SEQUENCE_GEN_ERROR\",\"业务模块\":\"任务中心\",\"名称\":\"任务单号生成出错\",\"国际化键\":\"message.task.sequence_gen_error\",\"消息\":\"任务单号生成出错\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_FEEDBACK_VALID_ADDRESS_NOT_NULL\",\"业务模块\":\"任务中心\",\"名称\":\"反馈信息不能为空\",\"国际化键\":\"message.task.task_feedback_valid_address_not_null\",\"消息\":\"反馈信息不能为空\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"TASK_FEEDBACK_VALID_ADDRESS_LENGTH_ERROR\",\"业务模块\":\"任务中心\",\"名称\":\"反馈信息长度超出\",\"国际化键\":\"message.task.task_feedback_valid_address_length_error\",\"消息\":\"反馈信息长度超出\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"DUTY_CODE_IS_NULL\",\"业务模块\":\"任务中心\",\"名称\":\"责任人编号不能为空\",\"国际化键\":\"message.task.duty_code_is_null\",\"消息\":\"责任人编号不能为空\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"},{\"编码\":\"CALLBACK_DATA_CANNOT_BE_EMPTY\",\"业务模块\":\"任务中心\",\"名称\":\"回调数据不能为空\",\"国际化键\":\"message.task.callback_data_cannot_be_empty\",\"消息\":\"回调数据不能为空\",\"说明\":\"MESSAGE\",\"类型\":\"API\",\"类别\":\"MESSAGE\"}]", JSONObject.class);
        Workbook workbook = generateExcelByJson(maps);
        // 将workbook文件保存至流输出
        File file = new File("D://demo.xlsx");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        workbook.write(fileOutputStream);
        workbook.close();
        fileOutputStream.close();

    }

    public static Workbook generateExcelByJson(List<JSONObject> maps) {
        List<ExcelExportEntity> excelExportEntities = new ArrayList<>();
        for (Object key : maps.get(0).keySet()) {
            ExcelExportEntity excelExportEntity = new ExcelExportEntity();
            String name = key.toString();
            excelExportEntity.setName(name);
            excelExportEntity.setKey(name);
            excelExportEntities.add(excelExportEntity);
        }
        return ExcelExportUtil.exportExcel(new ExportParams(), excelExportEntities, maps);
    }

}
